class Storage {
    // 静态方法 - 直接通过类名调用
    static setCookie(name, value) {
        console.log('this:', this); // this指向Storage类本身
        return `${name}=${value}`;
    }
    
    // 实例方法 - 需要通过实例调用
    setLocal(key, value) {
        console.log('this:', this); // this指向实例对象
        return `${key}=${value}`;
    }
}

// 使用区别：导出后
Storage.setCookie('test', 'value'); // ✅ 直接调用
// const storage = new Storage();
// storage.setLocal('key', 'value'); // ❌ 需要实例化

// 2. 核心区别对比
// 特性	静态方法（有static）	实例方法（无static）
// 调用方式	类名.方法名()	实例.方法名()
// this指向	类本身（构造函数）	实例对象
// 内存分配	类加载时分配，只存在一份	每个实例都有一份
// 访问权限	只能访问静态属性和方法	可以访问实例属性和静态属性
// 生命周期	与类共存亡	与实例共存亡
//static例子
class MathUtils {
    static PI = 3.14159;
    
    // 静态方法 - 工具函数，不需要实例状态
    static calculateArea(radius) {
        return this.PI * radius * radius; // this指向MathUtils类
    }
    
    static max(a, b) {
        return a > b ? a : b;
    }
}

// 使用：直接调用，不需要new
console.log(MathUtils.calculateArea(5)); // 78.53975
console.log(MathUtils.max(10, 20)); // 20
//实例
class User {
    constructor(name, age) {
        this.name = name;    // 实例属性
        this.age = age;      // 实例属性
    }
    
    // 实例方法 - 操作实例数据
    introduce() {
        return `我叫${this.name}，今年${this.age}岁`;
    }
    
    // 静态方法 - 工具函数
    static validateAge(age) {
        return age >= 0 && age <= 150;
    }
     // 如果错误地使用static，但可以直接接收参数，可以做一些日期等工具函数
    static getSessionInfo() {
        // 这里无法访问this.name，因为static方法没有实例上下文
        // console.log(this.name); // undefined
        return '无法获取具体用户信息';
    }
}
// 真正的区别👇👇👇👇👇👇👇关键理解：static是关于"属于类"还是"属于实例"的问题。工具功能属于类，业务逻辑属于实例。
// 使用实例方法
const user1 = new User('张三', 25);
console.log(user1.introduce()); // "我叫张三，今年25岁"

// 使用静态方法，注意看User，也可以传参
console.log(User.validateAge(200)); // false
//使用场景：static适合这种不需要实例的，类似工具函数的场景